/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package uy.edu.ort.arqsw.util;

import java.io.IOException;
import java.io.StringReader;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;
import uy.edu.ort.arqsw.domino.EntradaBlog;
import uy.edu.ort.arqsw.domino.PaginaWeb;
import uy.edu.ort.arqsw.domino.Tag;
import uy.edu.ort.arqsw.servicios.ResultadoEntradasBlog;
import uy.edu.ort.arqsw.servicios.ResultadoPaginasWeb;

/**
 *
 * @author victor
 */
public class UtilXML {
    static private SimpleDateFormat formatoFecha = new SimpleDateFormat("yyyy/MM/dd");
    
    public static Tag parseTag(String strTag) throws JDOMException, IOException, Exception {
        Tag tag = new Tag();
        
        SAXBuilder sb = new SAXBuilder();
        Document documento = sb.build(new StringReader(strTag));
           
        Element root = documento.getRootElement();
        
        if (root.getName().equals("Tag")) {
            Element elemento = root.getChild("Valor");
            if (elemento != null) {
                tag.setValor(elemento.getText()) ;
            } else {
                throw new Exception("String no válido (parametro Valor)");
            }
        } else {
            throw new Exception("String no válido (parametro Tag)");
        }
        
        return tag;
    }
    
    public static String parseTag(Tag tag) {       
        Element root = elementoTag(tag);
        
        Document documento = new Document(root);
        
        XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat()); 
        return outputter.outputString(documento);
    }
    
    public static EntradaBlog parseEntradaBlog(String strEntradaBlog) throws JDOMException, IOException, Exception {
        EntradaBlog entrada = new EntradaBlog();
        
        XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat());
        
        SAXBuilder sb = new SAXBuilder();
        Document documento = sb.build(new StringReader(strEntradaBlog));
           
        Element root = documento.getRootElement();
        
        if (root.getName().equals("EntradaBlog")) {
            Element elemento = root.getChild("Titulo");
            if (elemento != null) {
                entrada.setTitulo(elemento.getText()) ;
            } else {
                throw new Exception("String no válido (parametro Titulo)");
            }
            elemento = root.getChild("Autor");
            if (elemento != null) {
                entrada.setAutor(elemento.getText());
            } else {
                throw new Exception("String no válido (parametro Autor)");
            }
            elemento = root.getChild("Fecha");
            if (elemento != null) {
                entrada.setFecha(formatoFecha.parse(elemento.getText()));
            } else {
                throw new Exception("String no válido (parametro Fecha)");
            }
            elemento = root.getChild("Contenido");
            if (elemento != null) {
                entrada.setContenido(elemento.getText());
            } else {
                throw new Exception("String no válido (parametro Contenido)");
            }
            ArrayList<Tag> tags = new ArrayList<Tag>();
            elemento = root.getChild("Tags");
            if (elemento != null) {
                List<Element> elemTags = elemento.getChildren();
                for(Element e : elemTags) { 
                    Tag tag = parseTag(outputter.outputString(e));
                    tags.add(tag);
                }
            } else {
                throw new Exception("String no válido (parametro Tags)");
            }
            entrada.setTagCollection(tags);
        } else {
            throw new Exception("String no válido (parametro EntradaBlog)");
        }
        
        return entrada;
    }
    
    public static PaginaWeb parsePaginaWeb(String strPaginaWeb) throws JDOMException, IOException, Exception {
        PaginaWeb paginaweb = new PaginaWeb();
        
        SAXBuilder sb = new SAXBuilder();
        Document documento = sb.build(new StringReader(strPaginaWeb));
           
        Element root = documento.getRootElement();
        
        if (root.getName().equals("PaginaWeb")) {
            Element elemento = root.getChild("Titulo");
            if (elemento != null) {
                paginaweb.setTitulo(elemento.getText()) ;
            } else {
                throw new Exception("String no válido (parametro Titulo)");
            }
            elemento = root.getChild("Fecha");
            if (elemento != null) {
                paginaweb.setFecha(formatoFecha.parse(elemento.getText()));
            } else {
                throw new Exception("String no válido (parametro Fecha)");
            }
            elemento = root.getChild("Contenido");
            if (elemento != null) {
                paginaweb.setContenido(elemento.getText());
            } else {
                throw new Exception("String no válido (parametro Contenido)");
            }
        } else {
            throw new Exception("String no válido (parametro PaginaWeb)");
        }
        
        return paginaweb;
    }
    
    public static ResultadoEntradasBlog parseResultadoEntradaBlog(String strResultadoEntradaBlog) throws JDOMException, IOException, Exception {
        ResultadoEntradasBlog resultadoentrada = new ResultadoEntradasBlog();
        
        XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat());
        
        SAXBuilder sb = new SAXBuilder();
        Document documento = sb.build(new StringReader(strResultadoEntradaBlog));
           
        Element root = documento.getRootElement();
        
        if (root.getName().equals("ResultadoEntradaBlog")) {
            Element elemento = root.getChild("ResultadoCorrecto");
            if (elemento != null) {
                resultadoentrada.setResultadoCorrecto(Boolean.parseBoolean(elemento.getText())) ;
            } else {
                throw new Exception("String no válido (parametro ResultadoCorrecto)");
            }
            elemento = root.getChild("Descripcion");
            if (elemento != null) {
                resultadoentrada.setDescripcion(elemento.getText()) ;
            } else {
                throw new Exception("String no válido (parametro Descripcion)");
            }
            ArrayList<EntradaBlog> resultado = new ArrayList<EntradaBlog>();
            elemento = root.getChild("Resultado");
            if (elemento != null) {
                List<Element> elementos = elemento.getChildren();
                for (Element e : elementos) {
                    EntradaBlog entrada = parseEntradaBlog(outputter.outputString(e));
                    resultado.add(entrada);
                }                    
            } else {
                throw new Exception("String no válido (parametro Resultado)");
            }
            resultadoentrada.setResultado(resultado);
        } else {
            throw new Exception("String no válido (parametro ResultadoEntradaBlog)");
        }
        
        return resultadoentrada;
    }
    
    public static ResultadoPaginasWeb parseResultadoPaginaWeb(String strResultadoPaginaWeb) throws JDOMException, IOException, Exception {
        ResultadoPaginasWeb resultadopaginaweb = new ResultadoPaginasWeb();
        
        XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat());
        
        SAXBuilder sb = new SAXBuilder();
        Document documento = sb.build(new StringReader(strResultadoPaginaWeb));
           
        Element root = documento.getRootElement();
        
        if (root.getName().equals("ResultadoPaginaWeb")) {
            Element elemento = root.getChild("ResultadoCorrecto");
            if (elemento != null) {
                resultadopaginaweb.setResultadoCorrecto(Boolean.parseBoolean(elemento.getText())) ;
            } else {
                throw new Exception("String no válido (parametro ResultadoCorrecto)");
            }
            elemento = root.getChild("Descripcion");
            if (elemento != null) {
                resultadopaginaweb.setDescripcion(elemento.getText()) ;
            } else {
                throw new Exception("String no válido (parametro Descripcion)");
            }
            ArrayList<PaginaWeb> resultado = new ArrayList<PaginaWeb>();
            elemento = root.getChild("Resultado");
            if (elemento != null) {
                List<Element> elementos = elemento.getChildren();
                for (Element e : elementos) {
                    PaginaWeb pagina = parsePaginaWeb(outputter.outputString(e));
                    resultado.add(pagina);
                }                    
            } else {
                throw new Exception("String no válido (parametro Resultado)");
            }
            resultadopaginaweb.setResultado(resultado);
        } else {
            throw new Exception("String no válido (parametro ResultadoPaginaWeb)");
        }
        
        return resultadopaginaweb;
    }
    
    public static String parseEntradaBlog(EntradaBlog entradablog) {       
        Element root = elementoEntradaBlog(entradablog);
        
        Document documento = new Document(root);
        
        XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat()); 
        return outputter.outputString(documento);
    }
    
    public static String parsePaginaWeb(PaginaWeb paginaweb) {        
        Element root = elementoPaginaWeb(paginaweb);
        
        Document documento = new Document(root);
        
        XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat()); 
        return outputter.outputString(documento);
    }
    
    public static String parseResultadoEntradaBlog(ResultadoEntradasBlog resultadoentradablog) {
        Element root = elementoResultadoEntradaBlog(resultadoentradablog);
        
        Document documento = new Document(root);
        
        XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat()); 
        return outputter.outputString(documento);
    }
    
    public static String parseResultadoPaginaWeb(ResultadoPaginasWeb resultadopaginaweb) {
        Element root = elementoResultadoPaginaWeb(resultadopaginaweb);
        
        Document documento = new Document(root);
        
        XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat()); 
        return outputter.outputString(documento);
    }
    
    private static Element elementoTag(Tag tag) {       
        Element root = new Element("Tag");
        
        Element paramValor = new Element("Valor");
        paramValor.setText(tag.getValor());
        
        root.addContent(paramValor);
        
        return root;
    }
    
    private static Element elementoEntradaBlog(EntradaBlog entradablog) {       
        Element root = new Element("EntradaBlog");
        
        Element paramTitulo = new Element("Titulo");
        paramTitulo.setText(entradablog.getTitulo());
        
        Element paramAutor = new Element("Autor");
        paramAutor.setText(entradablog.getAutor());
        
        Element paramFecha = new Element("Fecha");
        paramFecha.setText(formatoFecha.format(entradablog.getFecha()));
        
        Element paramContenido = new Element("Contenido");
        paramContenido.setText(entradablog.getContenido().toString());
        
        Element paramTags = new Element("Tags");
        for (Tag tag : entradablog.getTagCollection()) {
            Element elmTag = new Element("Tag");
            Element elmValor = new Element("Valor");
            elmValor.setText(tag.getValor());
            elmTag.getChildren().add(elmValor);
            paramTags.getChildren().add(elmTag);
        }
        
        root.addContent(paramTitulo);
        root.addContent(paramAutor);
        root.addContent(paramFecha);
        root.addContent(paramContenido);
        root.addContent(paramTags);
        
        return root;
    }
    
    private static Element elementoPaginaWeb(PaginaWeb paginaweb) {       
        Element root = new Element("PaginaWeb");
        
        Element paramTitulo = new Element("Titulo");
        paramTitulo.setText(paginaweb.getTitulo());
        
        Element paramFecha = new Element("Fecha");
        paramFecha.setText(formatoFecha.format(paginaweb.getFecha()));
        
        Element paramContenido = new Element("Contenido");
        paramContenido.setText(paginaweb.getContenido());
        
        root.addContent(paramTitulo);
        root.addContent(paramFecha);
        root.addContent(paramContenido);
                
        return root;
    }     
    
    private static Element elementoResultadoEntradaBlog(ResultadoEntradasBlog resultadoentradablog) {
        Element root = new Element("ResultadoEntradaBlog");
        
        Element paramResultadoCorrecto = new Element("ResultadoCorrecto");
        paramResultadoCorrecto.setText(resultadoentradablog.getResultadoCorrecto().toString());
        
        Element paramDescripcion = new Element("Descripcion");
        paramDescripcion.setText(resultadoentradablog.getDescripcion());
        
        Element paramResultado = new Element("Resultado");
        for(EntradaBlog e : resultadoentradablog.getResultado())
            paramResultado.getChildren().add(elementoEntradaBlog(e));
        
        root.addContent(paramResultadoCorrecto);
        root.addContent(paramDescripcion);
        root.addContent(paramResultado);
        
        return root;
    }
    
    private static Element elementoResultadoPaginaWeb(ResultadoPaginasWeb resultadopaginaweb) {
        Element root = new Element("ResultadoPaginaWeb");
        
        Element paramResultadoCorrecto = new Element("ResultadoCorrecto");
        paramResultadoCorrecto.setText(resultadopaginaweb.getResultadoCorrecto().toString());
        
        Element paramDescripcion = new Element("Descripcion");
        paramDescripcion.setText(resultadopaginaweb.getDescripcion());
        
        Element paramResultado = new Element("Resultado");
        for(PaginaWeb e : resultadopaginaweb.getResultado())
            paramResultado.getChildren().add(elementoPaginaWeb(e));
        
        root.addContent(paramResultadoCorrecto);
        root.addContent(paramDescripcion);
        root.addContent(paramResultado);
        
        return root;
    }
}
